package com.fruit.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;

import javax.imageio.ImageIO;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import net.coobird.thumbnailator.Thumbnails;

/**
 * ftp上传下载工具类
 * <p>
 * Title: FtpUtil
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author Administrator 说明：日期处理 创建人：FH Q313596790
 * @version 2017.12.01 11:40
 */
public class FtpUtil {

	/**
	 * Description: 向FTP服务器上传文件
	 * 
	 * @param host
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param basePath
	 *            FTP服务器基础目录
	 * @param filePath
	 *            FTP服务器文件存放路径。例如分日期存放：/2015/01/01。文件的路径为basePath+filePath
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param input
	 *            输入流
	 * @return 成功返回true，否则返回false
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean uploadFile(String host, int port, String username, String password, String basePath,
			String filePath, String filename, InputStream input) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port); // 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password); // 登录
			reply = ftp.getReplyCode();
			System.out.println(1);
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			System.out.println(2);
			// 切换到上传目录
			if (!ftp.changeWorkingDirectory(basePath + filePath)) {
				// 如果目录不存在创建目录
				String[] dirs = filePath.split("/");
				String tempPath = basePath;
				for (String dir : dirs) {
					if (null == dir || "".equals(dir)) {
						continue;
					}
					tempPath += "/" + dir;
					if (!ftp.changeWorkingDirectory(tempPath)) {
						System.out.println("@@@1:" + tempPath);
						if (!ftp.makeDirectory(tempPath)) {
							System.out.println("@@@2:" + tempPath);
							return result;
						} else {
							System.out.println("@@@3:" + tempPath);
							ftp.changeWorkingDirectory(tempPath);
						}
					}
				}
			}
			// 设置上传文件的类型为二进制类型
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.enterLocalPassiveMode();
			// 上传文件
			System.out.println(3);
			if (!ftp.storeFile(filename, input)) {
				return result;
			}
			System.out.println(4);
			input.close();
			ftp.logout();
			result = true;
		} catch (Exception e) {
			System.out.println(5);
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * Description: 向FTP服务器上传文件
	 * 
	 * @param host
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param basePath
	 *            FTP服务器基础目录
	 * @param filePath
	 *            FTP服务器文件存放路径。例如分日期存放：/2015/01/01。文件的路径为basePath+filePath
	 * @param filename
	 *            上传到FTP服务器上的文件名
	 * @param input 输入流
	 * @param width 输入流
	 * @param height 输入流
	 * @param quality 输入流
	 * @return 成功返回true，否则返回false
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean uploadFile(String host, int port, String username, String password, String basePath,
			String filePath, String filename, InputStream input, int width, int height, float quality) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {

			InputStream sbsn = ThumbnailsCompressPic(input, width, quality);
			if (sbsn == null) {
				return result;
			}
			int reply;
			ftp.connect(host, port); // 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password); // 登录
			reply = ftp.getReplyCode();
			System.out.println(1);
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			System.out.println(2);
			// 切换到上传目录
			if (!ftp.changeWorkingDirectory(basePath + filePath)) {
				// 如果目录不存在创建目录
				String[] dirs = filePath.split("/");
				String tempPath = basePath;
				for (String dir : dirs) {
					if (null == dir || "".equals(dir)) {
						continue;
					}
					tempPath += "/" + dir;
					if (!ftp.changeWorkingDirectory(tempPath)) {
						System.out.println("@@@1:" + tempPath);
						if (!ftp.makeDirectory(tempPath)) {
							System.out.println("@@@2:" + tempPath);
							return result;
						} else {
							System.out.println("@@@3:" + tempPath);
							ftp.changeWorkingDirectory(tempPath);
						}
					}
				}
			}
			// 设置上传文件的类型为二进制类型
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.enterLocalPassiveMode();
			// 上传文件
			System.out.println(3);
			if (!ftp.storeFile(filename, sbsn)) {
				return result;
			}
			System.out.println(4);
			input.close();
			ftp.logout();
			result = true;
		} catch (Exception e) {
			System.out.println(5);
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @param host
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param remotePath
	 *            FTP服务器上的相对路径
	 * @param fileName
	 *            要下载的文件名
	 * @param localPath
	 *            下载后保存到本地的路径
	 * @return boolean
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
			String fileName, String localPath) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port);
			// 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password); // 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录
			FTPFile[] fs = ftp.listFiles();
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					File localFile = new File(localPath + "/" + ff.getName());

					OutputStream is = new FileOutputStream(localFile);
					ftp.retrieveFile(ff.getName(), is);
					is.close();
				}
			}

			ftp.logout();
			result = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @param host
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param remotePath
	 *            FTP服务器上的相对路径
	 * @param fileName
	 *            要下载的文件名
	 * @return boolean
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean cutPic(String host, int port, String username, String password, String remotePath,
			String fileName, String newfileName, int width, int height, float quality, boolean isFixed) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port);
			// 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password); // 登录
			// 设置下载文件的类型为二进制类型
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			ftp.enterLocalPassiveMode();
			ftp.setControlEncoding("UTF-8");
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}

			ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录
			InputStream ins = ftp.retrieveFileStream(fileName);

			InputStream insb = null;
			if (isFixed) {
				insb = cutImage(ins, width, height, quality);
			} else {
				insb = ThumbnailsCompressPic(ins, width, quality);
			}
			if (insb == null) {
				return result;
			}
			if (!ftp.completePendingCommand()) {
				return result;
			}
			if (!ftp.storeFile(newfileName, insb)) {
				return result;
			}
			insb.close();
			ftp.logout();
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @param  ins
	 *            ins
	 * @param size
	 *            size
	 * @param quality quality
	 * @return boolean
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static InputStream ThumbnailsCompressPic(InputStream ins, int size, float quality) {

		ByteArrayOutputStream out = null;
		try {

			BufferedImage src = ImageIO.read(ins);
			if (src.getWidth() > size && src.getHeight() > 0) {
				out = new ByteArrayOutputStream();
				BigDecimal oldH = new BigDecimal(src.getHeight(null));
				BigDecimal oldW = new BigDecimal(src.getWidth(null));
				BigDecimal height = oldH.divide(oldW, 2, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(size))
						.setScale(0, BigDecimal.ROUND_HALF_DOWN);

				Thumbnails.of(src).size(size, height.intValue()).outputQuality(quality).outputFormat("jpg")
						.toOutputStream(out);
				InputStream sbsn = new ByteArrayInputStream(out.toByteArray());
				return sbsn;
			} else {
				out = new ByteArrayOutputStream();
				Thumbnails.of(src).size(src.getWidth(), src.getHeight()).outputQuality(quality).outputFormat("jpg")
						.toOutputStream(out);
				InputStream sbsn = new ByteArrayInputStream(out.toByteArray());
				return sbsn;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @param  ins
	 *            ins
	 * @param width
	 *            width
	 * @param height
	 *            height
	 * @param quality quality
	 * @return boolean
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static InputStream cutImage(InputStream ins, int width, int height, float quality) {
		if (ins == null) {
			return null;
		}
		ByteArrayOutputStream out = null;
		try {
			out = new ByteArrayOutputStream();
			Thumbnails.of(ins).size(width, height).outputFormat("jpg").outputQuality(quality).toOutputStream(out);
			InputStream sbsn = new ByteArrayInputStream(out.toByteArray());

			return sbsn;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			if (ins != null) {
				try {
					ins.close();
				} catch (IOException e) {
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}

		}

	}

	/**
	 * Description: 从FTP服务器删除文件
	 * 
	 * @param host
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param imgPath
	 *            FTP服务器上的相对路径
	 * @return boolean
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean deleteFile(String host, int port, String username, String password, String imgPath) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port); // 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password); // 登录
			reply = ftp.getReplyCode();
			System.out.println(1);
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			ftp.dele(imgPath);
			ftp.logout();
			result = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * Description: 向FTP服务器上传文件
	 * 
	 * @param host
	 *            FTP服务器hostname
	 * @param port
	 *            FTP服务器端口
	 * @param username
	 *            FTP登录账号
	 * @param password
	 *            FTP登录密码
	 * @param basePath
	 *            FTP服务器基础目录
	 * @param filePaths
	 *            FTP服务器文件存放路径。例如分日期存放：/2015/01/01。文件的路径为basePath+filePath
	 * @param filenames
	 *            上传到FTP服务器上的文件名
	 * @param inputs
	 *            输入流
	 * @return 成功返回true，否则返回false
	 * @author Administrator
	 * @version 2017.12.01 11:40
	 */
	public static boolean uploadFiles(String host, int port, String username, String password, String basePath,
			String[] filePaths, String[] filenames, InputStream[] inputs) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port); // 连接FTP服务器
			// 如果采用默认端口，可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password); // 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			int i = 0;
			for (String filePath : filePaths) {
				result = false;
				// 切换到上传目录
				if (!ftp.changeWorkingDirectory(basePath + filePath)) {
					// 如果目录不存在创建目录
					String[] dirs = filePath.split("/");
					String tempPath = basePath;
					for (String dir : dirs) {
						if (null == dir || "".equals(dir)) {
							continue;
						}
						tempPath += "/" + dir;
						if (!ftp.changeWorkingDirectory(tempPath)) {
							if (!ftp.makeDirectory(tempPath)) {
								return result;
							} else {
								ftp.changeWorkingDirectory(tempPath);
							}
						}
					}
				}
				// 设置上传文件的类型为二进制类型
				ftp.setFileType(FTP.BINARY_FILE_TYPE);
				ftp.enterLocalPassiveMode();
				ftp.setControlEncoding("UTF-8");
				// 上传文件
				if (!ftp.storeFile(filenames[i], inputs[i])) {
					return result;
				}
				inputs[i].close();
				result = true;
				i++;
			}
			ftp.logout();

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

}
